package sifeap.pl.managedbean.solicitudesauxilio;

import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;

import org.primefaces.event.FileUploadEvent;

import sifeap.bl.ejb.solicitudesauxilio.SolicitudAuxilioBLLocal;
import sifeap.bl.ejb.solicitudesauxilio.TipoAuxilioBLLocal;
import sifeap.entities.solicitudesauxilio.EstadoAuxilio;
import sifeap.entities.solicitudesauxilio.SolicitudAuxilio;
import sifeap.entities.solicitudesauxilio.TipoAuxilio;
import sifeap.entities.solicitudesauxilio.valueobject.SolicitudAuxilioVO;
import sifeap.entities.soportes.Soporte;
import sifeap.entities.soportes.valueobject.SoporteVO;
import sifeap.entities.usuarios.valueobject.UsuarioVO;
import sifeap.exception.SifeapException;
import sifeap.pl.managedbean.usuarios.LoginManagedBean;
import sifeap.pl.util.FacesUtils;
import sifeap.pl.util.solicitudes.SolicitudesBase;
import sifeap.wrappers.asociados.VinculadoWrapper;

@ManagedBean(name="solicitudAuxilioManagedBean")
@SessionScoped
public class SolicitudAuxilioManagedBean extends SolicitudesBase {
	private VinculadoWrapper solicitante;
	private SolicitudAuxilio solicitudAuxilio;
	private SolicitudAuxilio ultimoAuxilioAprobado;
	
	private List<File> listaArchivosPrueba;
	
	@EJB
	private TipoAuxilioBLLocal tipoAuxilioBL;

	@EJB
	private SolicitudAuxilioBLLocal solicitudAuxilioBL;

	@PostConstruct
	public void inicializar() {
		cargarDatosPredeterminados();
		cargarDatosAsociado(null);
		
		setAccion(getAccionOrigen());
		
		//Asume que viene de "Mis solicitudes de auxilio" o "Consultar Auxilios"
		if (getAccion() == SolicitudAuxilioVO.ACCION_MODIFICAR
				|| getAccion() == SolicitudAuxilioVO.ACCION_DETALLE_MIS_SOLICITUDES
				|| getAccion() == SolicitudAuxilioVO.ACCION_DETALLE_CONSULTAR) {
			//Modificar la solicitud
			setSolicitudAuxilio(getSolicitudAuxilioSeleccionada());
			
			//Debe cargar el deudor de la BD
			cargarDatosAsociado(getSolicitudAuxilio().getVincedula());
			
			//Debe cargar los soportes
			List<Soporte> listaSoportes = getSolicitudAuxilio().getSoportes();
			if (listaSoportes != null) {
				listaArchivosPrueba = new ArrayList<File>();
				for (Soporte soporte : listaSoportes) {
					listaArchivosPrueba.add(new File(soporte.getNombreArchivo()));
				}
			}
			
			//Debe cargar el ultimo auxilio aprobado de este tipo
			try {
				ultimoAuxilioAprobado = solicitudAuxilioBL.buscarUltimoAuxilioAprobado(getSolicitudAuxilio().getVincedula(), getSolicitudAuxilio().getTiposauxilio().getIdTipoAuxilio());
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	public VinculadoWrapper getSolicitante() {
		return solicitante;
	}

	public void setSolicitante(VinculadoWrapper solicitante) {
		this.solicitante = solicitante;
	}

	public SolicitudAuxilio getSolicitudAuxilio() {
		return solicitudAuxilio;
	}

	public void setSolicitudAuxilio(SolicitudAuxilio solicitudAuxilio) {
		this.solicitudAuxilio = solicitudAuxilio;
	}
	
	public List<File> getListaArchivosPrueba() {
		return listaArchivosPrueba;
	}
	
	public SolicitudAuxilio getUltimoAuxilioAprobado() {
		return ultimoAuxilioAprobado;
	}

	public void setUltimoAuxilioAprobado(SolicitudAuxilio ultimoAuxilioAprobado) {
		this.ultimoAuxilioAprobado = ultimoAuxilioAprobado;
	}
		
	private void cargarDatosAsociado(String cedula) {
		if (cedula == null) {
			//Asume que debe tomar el usuario en sesion...
			UsuarioVO usuario = (UsuarioVO) FacesUtils.getSessionAttribute(LoginManagedBean.USER_LOGIN);
			if (usuario != null && usuario.getVinculado() != null) {
				setSolicitante(usuario.getVinculado());
			}
		} else {}
	}
	
	private void cargarDatosPredeterminados() {
		solicitudAuxilio = new SolicitudAuxilio();
		solicitudAuxilio.setTiposauxilio(new TipoAuxilio());
		
		listaArchivosPrueba = new ArrayList<File>();
		
		setArchivoSeleccionado(null);
		
		try {
			if (stream != null) {
				stream.close();
			}
		} catch (Exception e) {}
		
		mostrarArchivo = null;
		
		setMostrarAdvertencia(false);
	}
	
	private void limpiarCampos() {
		cargarDatosPredeterminados();
	}

	private boolean validarObligatorios() {
		boolean resultado = true;
		
		if (!(getSolicitudAuxilio().getTiposauxilio().getIdTipoAuxilio() != null && getSolicitudAuxilio().getTiposauxilio().getIdTipoAuxilio().longValue() > 0)) {
			resultado = false;
			try {
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.solicitudauxilio.tipoauxilio.obligatorio"), false);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		if (!(getSolicitudAuxilio().getPruebasAportadas() != null && getSolicitudAuxilio().getPruebasAportadas().trim().length() > 0)) {
			resultado = false;
			try {
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.solicitudauxilio.descripcion.obligatorio"), false);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		if (!(listaArchivosPrueba != null && listaArchivosPrueba.size() > 0)) {
			resultado = false;
			try {
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.solicitudauxilio.adjuntarprueba.obligatorio"), false);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		return resultado;
	}
	
	private int getAccionOrigen() {
		MisSolicitudesAuxilioManagedBean misSolicitudesBean = (MisSolicitudesAuxilioManagedBean) FacesUtils.getSessionAttribute("misSolicitudesAuxilioManagedBean");
		ConsultarSolicitudesAuxilioManagedBean consultarSolicitudesBean = (ConsultarSolicitudesAuxilioManagedBean) FacesUtils.getSessionAttribute("consultarSolicitudesAuxilioManagedBean");
		
		if (misSolicitudesBean != null && misSolicitudesBean.getSolicitudAuxilioSeleccionada() != null) {
			return misSolicitudesBean.getAccion();
		} else if (consultarSolicitudesBean != null && consultarSolicitudesBean.getSolicitudAuxilioSeleccionada() != null) {
			return consultarSolicitudesBean.getAccion();
		} else {
			return SolicitudAuxilioVO.ACCION_CREAR;
		}
	}
	
	private SolicitudAuxilio getSolicitudAuxilioSeleccionada() {
		MisSolicitudesAuxilioManagedBean misSolicitudesBean = (MisSolicitudesAuxilioManagedBean) FacesUtils.getSessionAttribute("misSolicitudesAuxilioManagedBean");
		ConsultarSolicitudesAuxilioManagedBean consultarSolicitudesBean = (ConsultarSolicitudesAuxilioManagedBean) FacesUtils.getSessionAttribute("consultarSolicitudesAuxilioManagedBean");

		if (misSolicitudesBean != null && misSolicitudesBean.getSolicitudAuxilioSeleccionada() != null) {
			return misSolicitudesBean.getSolicitudAuxilioSeleccionada();
		} else if (consultarSolicitudesBean != null && consultarSolicitudesBean.getSolicitudAuxilioSeleccionada() != null) {
			return consultarSolicitudesBean.getSolicitudAuxilioSeleccionada();
		} else {
			return new SolicitudAuxilio();
		}
	}
	
	public List<SelectItem> getItemsTiposAuxilio() {
		List<TipoAuxilio> listaTiposAuxilio = null;
		try {
			listaTiposAuxilio = tipoAuxilioBL.buscarTodos();
		} catch (SifeapException e) {
			e.printStackTrace();
		}
		
		List <SelectItem> itemsTiposAuxilio = new ArrayList<SelectItem>();
		if (listaTiposAuxilio != null) {
			for (TipoAuxilio tipoAuxilio : listaTiposAuxilio) {
				itemsTiposAuxilio.add(new SelectItem(tipoAuxilio.getIdTipoAuxilio(), tipoAuxilio.getNombre()));
			}
		}
		return itemsTiposAuxilio;
	}
	
	public void subirArchivoPrueba(FileUploadEvent event) {
		try {
            if (listaArchivosPrueba == null) {
            	listaArchivosPrueba = new ArrayList<File>();
            }
            listaArchivosPrueba.add(guardarArchivo(event));
        } catch (Exception e) {
        	try {
        		FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.solicitudcredito.subirarchivo.error"), false);
			} catch (Exception e1) {}
        	
            e.printStackTrace();
        }
    }
	
	public String eliminarArchivoPrueba() {		
		try {
			if (eliminarArchivo()) {
				listaArchivosPrueba.remove(getArchivoSeleccionado());
			} else {
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.solicitudcredito.eliminararchivo.error1"), false);
			}
		} catch (Exception e) {
			try {
        		FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.solicitudcredito.eliminararchivo.error2"), false);
			} catch (Exception e1) {}
			e.printStackTrace();
		}
		return "";
	}
	
	public String guardarEnviar() {
		//Envia a estudio
		EstadoAuxilio estadoAuxilio = new EstadoAuxilio();
		estadoAuxilio.setIdEstadoAuxilio(SolicitudAuxilioVO.ESTADO_AUXILIO_EN_ESTUDIO);
		solicitudAuxilio.setEstadosauxilio(estadoAuxilio);
		return guardar();
	}
	
	public String guardar() {
		setMostrarAdvertencia(false);
		
		//Valida los obligatorios
		if (!validarObligatorios()) {
			return "";
		}
		
		solicitudAuxilio.setVincedula(getSolicitante().getCedula());
		if (!(solicitudAuxilio.getEstadosauxilio() != null 
				&& solicitudAuxilio.getEstadosauxilio().getIdEstadoAuxilio() == SolicitudAuxilioVO.ESTADO_AUXILIO_EN_ESTUDIO)) {
			EstadoAuxilio estadoAuxilio = new EstadoAuxilio();
			estadoAuxilio.setIdEstadoAuxilio(SolicitudAuxilioVO.ESTADO_AUXILIO_PRELIMINAR);
			solicitudAuxilio.setEstadosauxilio(estadoAuxilio);
		}
		
		solicitudAuxilio.setFechaSolicitud(new Date());
		
		solicitudAuxilio.setSoportes(obtenerListaSoportes(listaArchivosPrueba, SoporteVO.SOPORTE_AUXILIO, null));
		
		UsuarioVO usuario = (UsuarioVO) FacesUtils.getSessionAttribute(LoginManagedBean.USER_LOGIN);
		solicitudAuxilio.setUsuario(usuario.getUsuario());
		
		TipoAuxilio tipoAuxilio = new TipoAuxilio();
		tipoAuxilio.setIdTipoAuxilio(getSolicitudAuxilio().getTiposauxilio().getIdTipoAuxilio());
		solicitudAuxilio.setTiposauxilio(tipoAuxilio);
		
		try {
			byte resultado = 0;
			
			if (getAccion() == SolicitudAuxilioVO.ACCION_MODIFICAR) {
				//Modifica...
				resultado = solicitudAuxilioBL.modificar(solicitudAuxilio);
			} else {
				resultado = solicitudAuxilioBL.crear(solicitudAuxilio);
			}
			
			switch (resultado) {
				case 1:
					//Exitoso
					if (getAccion() == SolicitudAuxilioVO.ACCION_MODIFICAR) {
						FacesUtils.addInfoMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.solicitudauxilio.modificar.exito"), true);
						
						MisSolicitudesAuxilioManagedBean managedBean = (MisSolicitudesAuxilioManagedBean) FacesUtils.getSessionAttribute("misSolicitudesAuxilioManagedBean");
						if (managedBean != null) {
							managedBean.consultar();
						}
						
						limpiarCampos();
						
						//Debe redireccionar...
						return "/web/solicitudesAuxilio/misSolicitudes.jsf?faces-redirect=true";
					} else {
						FacesUtils.addInfoMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.solicitudauxilio.crear.exito"), false);
						
						boolean mostrar = false;
						if (!(solicitudAuxilio.getEstadosauxilio() != null
								&& solicitudAuxilio.getEstadosauxilio().getIdEstadoAuxilio() == SolicitudAuxilioVO.ESTADO_AUXILIO_EN_ESTUDIO)) {
							mostrar = true;
						}
						
						limpiarCampos();
						setMostrarAdvertencia(mostrar);
					}
					break;
	
				default:
					break;
			}
			
		} catch (Exception e) {
			try {
				if (getAccion() == SolicitudAuxilioVO.ACCION_MODIFICAR) {
					FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.solicitudauxilio.crear.error"), true);
					return "/web/solicitudesAuxilio/misSolicitudes.jsf";
				} else {
					FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.solicitudauxilio.crear.error"), false);
				}
			} catch (Exception e1) {}
			e.printStackTrace();
			return "";
		}
		return "";
	}
	
	public String limpiar() {
		limpiarCampos();
		return "/web/solicitudesAuxilio/solicitudAuxilio.jsf";
	}
	
	public String cancelar() {
		String redirigir = "";
		
		if (getAccion() == SolicitudAuxilioVO.ACCION_MODIFICAR 
				|| getAccion() == SolicitudAuxilioVO.ACCION_DETALLE_MIS_SOLICITUDES) {
			redirigir = "/web/solicitudesAuxilio/misSolicitudes.jsf?faces-redirect=true";
		} else if (getAccion() == SolicitudAuxilioVO.ACCION_DETALLE_CONSULTAR) {
			redirigir = "/web/solicitudesAuxilio/consultarSolicitudes.jsf?faces-redirect=true";
		}
		
		limpiarCampos();
		
		return redirigir;
	}
	
	/**
	 * Verifica si para el usuario autenticado tiene los permisos solicitados
	 * @return
	 */
	public boolean isTienePermisos() {
		return LoginManagedBean.tienePermisos("solicitar_auxilio:crear","solicitar_auxilio:editar","solicitar_auxilio:detallar");
	}
}